package com.coder.algorithm.offer_2;

/**
 * 单例模式
 *
 * 实现 Singleton 模式
 *
 * @author yuhushuan
 * @date 2020/5/24 01:27
 */
public class _02_1_Singleton {

    /**
     * 如果没有volatile关键字
     * `instance = new Singleton();` 可能出现指令重排序
     * 线程 1：分配内存；instance 指向内存；对象并没有初始化；
     * 线程 2：在第一次判断 null == instance 时为 false，从而返回未初始化的对象。
     *
     */
    private volatile static _02_1_Singleton instance;

    private _02_1_Singleton() {}

    public static _02_1_Singleton getInstance() {
        if (null == instance) {
            synchronized (_02_1_Singleton.class) {
                if (null == instance) {
                    instance = new _02_1_Singleton();
                }
            }
        }
        return instance;
    }
}
